﻿using System;
using System.Data.Services.Client;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web.Security;
using jp110311.StorageModels;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;

namespace MvcWebRole1.Tests.Providers
{
    /// <summary>
    /// MembershipProviderTest の概要の説明
    /// </summary>
    [TestClass]
    public class MembershipProviderTest
    {
        /// <summary>
        ///現在のテストの実行についての情報および機能を
        ///提供するテスト コンテキストを取得または設定します。
        ///</summary>
        public TestContext TestContext { get; set; }

        #region 追加のテスト属性
        //
        // テストを作成する際には、次の追加属性を使用できます:
        //
        // クラス内で最初のテストを実行する前に、ClassInitialize を使用してコードを実行してください
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // クラス内のテストをすべて実行したら、ClassCleanup を使用してコードを実行してください
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 各テストを実行する前に、TestInitialize を使用してコードを実行してください
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 各テストを実行した後に、TestCleanup を使用してコードを実行してください
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [ClassInitialize()]
        public static void ClassInitialize(TestContext testContext)
        {
            // SDK でストレージエミュレーターを起動してからテスト実行してね！
            CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
            CloudTableClient client = account.CreateCloudTableClient();
            var tables = client.ListTables().ToList();
            foreach (var table in tables)
            {
                client.DeleteTableIfExist(table);
            }
            
            AzureTableMembershipProvider.DataServiceContextCreated += contextCreated;
        }

        private static void contextCreated(object sender, DataServiceContextCreatedEventArgs e)
        {
            e.Context.SendingRequest += (s,ee)=> Console.WriteLine( ee.Request.RequestUri ) ;
        }

        [TestMethod]
        public void CreateuserNormal()
        {
            var user = Membership.CreateUser("1234567@user", "password");
            Assert.IsNotNull(user);
        }

        [TestMethod]
        [ExpectedException(typeof(MembershipCreateUserException))]
        public void CreateuserNormalConfrict()
        {
            var user1 = Membership.CreateUser("1234567@user1", "password");
            var user2 = Membership.CreateUser("1234567@user1", "password");
            Assert.IsNotNull(user1);
        }

        [TestMethod]
        public void CreateUserDetail()
        {
            var user = Membership.CreateUser("1234567@userX", "password");
            Assert.AreEqual("1234567@userX", user.UserName);
            Assert.IsTrue( user.IsApproved ); // 後から承認とか面倒なので、このプロバイダはデフォルトで Approved にします
            Assert.IsFalse( user.IsLockedOut );
//            Assert.IsFalse( user.IsOnline );

            var verified = Membership.ValidateUser("1234567@userX", "password");
            Assert.IsTrue( verified );
            Assert.IsFalse( Membership.ValidateUser("1234567@userX", "badPassword"));
        }


    }
}
